class Person {}
class Student {}

// instanceType<T> 获取构造函数类型
// 类型体操
// infer R 推导类型表示: R是构造函数的返回值类型
type InstanceType<T extends new (...args: any[]) => any> = T extends new (...args: any[]) => infer R ? R : any

const p1: Person = new Person()

// typeof Person: 构造函数具体的类型
// InstanceType构造函数创建出来的实例对象的类型
type PersonType = InstanceType<typeof Person>
const p2: PersonType = new Person()

// 构造函数的例子
// 通过的创建实例的工具函数时会用到这个InstanceType
function factory<T extends new (...args: any[]) => any>(ctor: T): InstanceType<T> {
  return new ctor()
}

const p3 = factory(Person)
const s1 = factory(Student)

export {}